﻿using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using NovaSystem.ComponentesNegocio;
using NovaSystem.EntidadesNegocio;
using System.Transactions;

namespace NovaSystem.InterfazUsuarioWeb.Contabilidad
{
    public partial class wfProveedorFactura : System.Web.UI.Page
    {
        private const string CONCEPTO_PAIS = "PAIS";
        private const string CONCEPTO_MONEDA = "MONEDA";
        private const int COL_IDPRODUCTO = 1;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                InicializarPagina();
                LlenarCombos();
                DefaultCombos();
            }
        }

        private void DefaultCombos()
        {
            parametros param = Negocioparametros.Instancia.Listar()[0];
            ddlPais.SelectedValue = param.codigoPaisDefault;
            ddlMoneda.SelectedValue = param.codigoMonedaDefault;
        }

        private void LlenarCombos()
        {
            ddlPais.DataSource = Negociomantenedor.Instancia.Listar(CONCEPTO_PAIS);
            ddlPais.DataBind();

            ddlMoneda.DataSource = Negociomantenedor.Instancia.Listar(CONCEPTO_MONEDA);
            ddlMoneda.DataBind();
        }

        private void InicializarPagina()
        {
            btnBuscarProveedor.Attributes.Add("onclick", "ModalPopup3('wfBProveedor.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtRutProveedor.ClientID + "','" + txtNombreProveedor.ClientID + "','" + hfIdProveedor.ClientID + "');return false;");
            btnBuscarProducto.Attributes.Add("onclick", "ModalPopup3('" +  Page.ResolveUrl("~") + "Logistica/wfBProducto.aspx','dialogHeight:400px;dialogWidth:790px;edge:sunken;status:no;unadorned:yes','" + txtProducto.ClientID + "','" + txtDescripcion.ClientID + "','" + hfIdProducto.ClientID + "');return false;");
            txtCantidad.Attributes.Add("onblur", "var cantidad = " + txtCantidad.ClientID + ".value; var precio = " + txtPrecio.ClientID + ".value;total = parseFloat(cantidad) * parseFloat(precio);" + txtTotal.ClientID + ".value = total;");
            txtPrecio.Attributes.Add("onblur", "var cantidad = " + txtCantidad.ClientID + ".value; var precio = " + txtPrecio.ClientID + ".value;total = parseFloat(cantidad) * parseFloat(precio);" + txtTotal.ClientID + ".value = total;");
            CrearTablaTemporalDetalle();
        }

        private void CrearTablaTemporalDetalle()
        {
            DataTable tblDetalle = new DataTable();
            DataColumn colIdProducto = new DataColumn("idProducto", typeof(int));
            DataColumn colCodProducto = new DataColumn("codigo",typeof(string));
            DataColumn colDesProducto = new DataColumn("descripcion",typeof(string));
            DataColumn colCantidad = new DataColumn("cantidad",typeof(int));
            DataColumn colPrecio = new DataColumn("precio",typeof(decimal));
            DataColumn colTotal = new DataColumn("total",typeof(decimal));
            tblDetalle.Columns.Add(colIdProducto);
            tblDetalle.Columns.Add(colCodProducto);
            tblDetalle.Columns.Add(colDesProducto);
            tblDetalle.Columns.Add(colCantidad);
            tblDetalle.Columns.Add(colPrecio);
            tblDetalle.Columns.Add(colTotal);
            Session["tblDetalle"] = tblDetalle;
        }


        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            decimal precio = 0;
            decimal cantidad = 0;
            decimal.TryParse(txtPrecio.Text, out precio);
            decimal.TryParse(txtCantidad.Text, out cantidad);


            DataTable tblDetalle = (DataTable)Session["tblDetalle"];
            DataRow nuevaFila = tblDetalle.NewRow();
            nuevaFila["idProducto"] = hfIdProducto.Value;
            nuevaFila["codigo"] = txtProducto.Text;
            nuevaFila["descripcion"] = txtDescripcion.Text;
            nuevaFila["cantidad"] = txtCantidad.Text;
            nuevaFila["precio"] = txtPrecio.Text;
            nuevaFila["total"] = (precio * cantidad).ToString();
            tblDetalle.Rows.Add(nuevaFila);
            Session["tblDetalle"] = tblDetalle;
            gvDetalle.DataSource = tblDetalle;
            gvDetalle.DataBind();

            txtCantidad.Text = "";
            txtPrecio.Text = "";
            txtDescripcion.Text = "";
            txtProducto.Text = "";
            hfIdProducto.Value = "";
            txtTotal.Text = "";

            ObtenerTotales();

        }

        private void ObtenerTotales()
        {
            try
            {
                
                parametros param = Negocioparametros.Instancia.Listar()[0];
                DataTable tblDetalle = (DataTable)Session["tblDetalle"];
                decimal subtotal = (decimal)tblDetalle.Compute("Sum(total)", "");
                decimal total = 0;
                decimal descuento = 0;
                decimal.TryParse(txtDescuento.Text, out descuento);

                txtSubTotal.Text = subtotal.ToString();
                txtIva.Text = param.impuesto.ToString();
                total = subtotal * param.impuesto / 100;
                txtTotalGeneral.Text = total.ToString();
                if (descuento == 0)
                    txtDescuento.Text = "0";
                

            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        protected void gvDetalle_RowCreated(object sender, GridViewRowEventArgs e)
        {
            e.Row.Cells[COL_IDPRODUCTO].Visible = false;
        }

       

        protected void OnDelete(object sender, CommandEventArgs e)
        {
            DataTable tblDetalle = (DataTable)Session["tblDetalle"];
            int index = int.Parse(e.CommandArgument.ToString());
            tblDetalle.Rows.RemoveAt(index);
            Session["tblDetalle"] = tblDetalle;
            gvDetalle.DataSource = tblDetalle;
            gvDetalle.DataBind();
            ObtenerTotales();
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            if (ValidarDatosGrabar())
            {
                try
                {
                    int idFactura = 0;
                    int numeroFactura = 0;
                    int idProveedor = 0;
                    int ordenCompra = 0;
                    decimal tipoCambio = 0;
                    decimal subtotal = 0;
                    decimal impuesto = 0;
                    decimal total = 0;
                    decimal descuento = 0;
                    DateTime fechaFactura = new DateTime(1900,1,1);
                    

                    int.TryParse(txtNumeroFactura.Text, out numeroFactura);
                    DateTime.TryParse(txtFechaFactura.Text, out fechaFactura);
                    int.TryParse(hfIdProveedor.Value, out idProveedor);
                    int.TryParse(txtOrdenCompra.Text, out ordenCompra);
                    decimal.TryParse(txtTipoCambio.Text, out tipoCambio);
                    decimal.TryParse(txtSubTotal.Text, out subtotal);
                    decimal.TryParse(txtIva.Text, out impuesto);
                    decimal.TryParse(txtTotalGeneral.Text, out total);
                    decimal.TryParse(txtDescuento.Text, out descuento);

                    DataTable tblDetalle = (DataTable)Session["tblDetalle"];

                    using (TransactionScope tran = new TransactionScope())
                    {
                        facturacompra factura = new facturacompra();
                        factura.numeroFactura = numeroFactura;
                        factura.fechaFactura = fechaFactura;
                        factura.idProveedor = idProveedor;
                        factura.afectaExenta = ddlAfectaExcenta.SelectedValue;
                        factura.tipoCambio = tipoCambio;
                        factura.direccion = txtDireccionProveedor.Text;
                        factura.conceptoPais = CONCEPTO_PAIS;
                        factura.codigoPais = ddlPais.SelectedValue;
                        factura.conceptoMoneda = CONCEPTO_MONEDA;
                        factura.codigoMoneda = ddlMoneda.SelectedValue;
                        factura.ordenCompra = ordenCompra;
                        factura.subTotal = subtotal;
                        factura.impuesto = impuesto;
                        factura.total = total;
                        factura.descuento = descuento;
                        factura.observacion = txtObservacion.Text;
                        factura.usuario = Context.User.Identity.Name;
                        int.TryParse(Negociofacturacompra.Instancia.Insertar(factura),out idFactura);



                        foreach(DataRow fila in tblDetalle.Rows)
                        {
                            int cantidad = 0;
                            int idProducto = 0;
                            decimal precio = 0;
                            decimal totaldet = 0;
                            int.TryParse(fila["cantidad"].ToString(), out cantidad);
                            int.TryParse(fila["idProducto"].ToString(), out idProducto);
                            decimal.TryParse(fila["precio"].ToString(), out precio);
                            decimal.TryParse(fila["total"].ToString(), out totaldet);

                            facturacompradet facturadet = new facturacompradet();
                            facturadet.cantidad = cantidad;
                            facturadet.idProducto = idProducto;
                            facturadet.descripcionProducto = fila["descripcion"].ToString();
                            facturadet.idFactura = idFactura;
                            facturadet.precio = precio;
                            facturadet.total = totaldet;
                            facturadet.usuario = Context.User.Identity.Name;
                            Negociofacturacompradet.Instancia.Insertar(facturadet);
                        }


                        tran.Complete();
                    }
                    
                    

                }
                catch (Exception ex)
                {

                }

            }

        }

        private bool ValidarDatosGrabar()
        {
            try
            {
                return true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        
    
    }
}
